package com.atguigu.bigdata.spark.zzgcore.rdd.operator.transform

import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext}

/**
 * @Classname Spark01_RDD_Operation_Transfrom
 * @Description 相同的首字母放在一个组中
 * @Date 2023/9/20 15:23
 * @Author zhuzhenguo
 */
object Spark08_RDD_Operation_Transform {
  def main(args: Array[String]): Unit = {
    // 准备环境,这个 *表示系统当前最大可用核数
    val sparkConf: SparkConf = new SparkConf().setMaster("local[*]").setAppName("Operator")
    val sc = new SparkContext(sparkConf)
    val rdd: RDD[Int] = sc.makeRDD(List(1, 2, 3, 4, 5, 6, 7, 8, 9, 10))
    // sample 需要传递三个参数
    // 1、第一个参数表示，抽取数据后是否将数据返回true（放回），false（丢弃）
    // 2、第二个参数表示：
    //          抽取不放回的情形：数据源中每条数据被抽取的概率（基准值的概念）
    //          抽取放回的情形：数据源中每条数据被抽取的可能次数
    // 3、第三个参数表示，抽取数据随机算法的种子(种子确定了，随机数就确定了)
    // 如果不传递第三个参数，那么使用的是当前系统时间

    // shuffle的时候会打乱重新组合，会导致数据倾斜，资源浪费
    // sample可以判断数据是怎么倾斜了
    // 抽取数据是在特殊的场合下使用的
    println(rdd.sample(withReplacement = false, 0.4).collect().mkString(""))
    println(rdd.sample(withReplacement = true, 2).collect().mkString(""))

    // 关闭环境
    sc.stop()
  }
}
